class webSocketService {
    constructor(url, time) {
        this.is_open_socket = false // 避免重复链接
        this.url = url // 地址
        this.data = null
        // 心跳监测
        this.timeout = time // 多少秒执行监测
        this.heartbeatInterval = null // 监测服务器端是否还活着
        this.reconnectTimeOut = null // 重连多久后再次重连
        try {
            return this.connectSocketInit()
        } catch (e) {
            console.log('catch')
            this.is_open_socket = false
            this.reconnect()
        }
    }

    // 进入页面的时候创建webSocket连接 【整个页面随时使用】
    connectSocketInit() {
        this.socketTask = uni.connectSocket({
            url: this.url,
            success: () => {
                console.log('正在准备建立WebSocketService中...')
                // 返回实例
                return this.socketTask
            }
        })
        this.socketTask.onOpen(res => {
            console.log('WebSocketService连接正常！', res)
            clearTimeout(this.reconnectTimeOut)
            clearTimeout(this.heartbeatInterval)
            this.is_open_socket = true
            this.start()
            // 注意：只有连接正常打开中，才能正常收到消息
            this.socketTask.onMessage(res => {
                console.log('收到消息',res)
            })
        })
        // 监听连接失败，这里代码注释掉的原因是因为如果服务器关闭后，和下面的onclose方法一起发起重连操作，这样会导致重复连接
        uni.onSocketError((res) => {
        	console.log('WebSocket连接打开失败，请检查！', res);
        	this.is_open_socket = false;
        	this.reconnect();
        });
        // 这里仅是事件监听【如果socket关闭了会执行】
        this.socketTask.onClose(() => {
            console.log("已经被关闭了")
            this.is_open_socket = false;
            this.reconnect();
        })
    }

    // 发送消息
    async send(value) {
        await new Promise(resolve => {
            setTimeout(() => {
                resolve()
            }, 1000)
        })
        // 注：只有连接正常打开中，才能正常成功发送消息
        this.socketTask.send({
            data: value,
            async success() {
                console.log('消息发送成功', value)
            }
        })
    }

    // 开启心跳检测
    start() {
        this.heartbeatInterval = setInterval(() => {
            this.data = '发送的消息'
            this.send(this.data)
        }, this.timeout)
    }

    // 重新连接
    reconnect() {
        // 停止发送心跳
        clearInterval(this.heartbeatInterval)
        // 如果不是人为关闭的话就重新连接
        if (!this.is_open_socket) {
            this.reconnectTimeOut = setTimeout(() => {
                this.connectSocketInit()
            }, 3000)
        }
    }

    // 外部获取消息
    getMessage(callback) {
        this.socketTask.onMessage(res => {
            return callback(res)
        })
    }
}

module.exports = webSocketService
